<?php
/**
 * Created by PhpStorm.
 * User: 65736
 * Date: 2019/2/28 0028
 * Time: 16:43
 */

namespace app\command;


use app\common\library\CommonFun;
use think\console\Input;
use think\console\input\Argument;
use think\console\input\Option;
use think\console\Output;
use think\Exception;

class Run extends Common
{
    /**
     * 要执行的类
     * @var \stdClass
     */
    var $class;

    /**
     * 要执行的类方法
     * @var string
     */
    var $method;

    /**
     * 要执行的类方法数组
     * @var array
     */
    var $param;

    /**
     * 执行结果
     * @var mixed
     */
    var $result;

    /**
     * 命令配置
     * @return mixed
     */
    protected function config()
    {
        // 设置命令描述
        $this->setDescription("Cli程序入口程序")->setHelp("Cli程序入口程序");
        // 需要执行的类
        $this->addOption('class', 'c', Option::VALUE_REQUIRED, '需要执行的类名称');
        // 需要执行的类方法
        $this->addOption('method', 'm', Option::VALUE_REQUIRED, '需要执行的方法');
        // 需要专递的参数
        $this->addArgument('param', Argument::IS_ARRAY, '需要传递的参数');

        return $this;
    }

    /**
     * 检测参数
     * @param Input $input
     * @param Output $output
     * @throws Exception
     */
    protected function interact(Input $input, Output $output)
    {
        parent::interact($input, $output);
        // 检测输入
        $class_name = $input->getOption('class');
        if ( !$class_name ) {
            throw new Exception("必传选项--class错误");
        }
        $method = $input->getOption('method');
        if ( !$method ) {
            throw new Exception("必传选项--method错误");
        }
        $class = __NAMESPACE__."\\lib\\{$class_name}";
        if ( !class_exists($class) ) {
            throw new Exception("执行类[{$class}]文件不存在");
        }
        if ( !method_exists( $class, $method ) ) {
            throw new Exception("执行类[{$class}]不存在方法{$method}");
        }
        // 赋值
        $this->class = $class;
        $this->method = $method;
        $this->param = $input->getArgument("param");
    }

    /**
     * 执行命令(实际执行的方法体)
     * @param Input $input
     * @param Output $output
     * @return int|null|void
     */
    protected function exec(Input $input, Output $output)
    {
        $obj = new $this->class;
        $this->result = call_user_func_array( array(&$obj, $this->method), $this->param );
    }


}